package priv.conceit.sc.hoxton.file.handle.preview;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import priv.conceit.sc.hoxton.common.entity.file.dto.FilePathDTO;
import priv.conceit.sc.hoxton.common.entity.file.dto.FilePreviewDTO;
import priv.conceit.sc.hoxton.common.util.FileUtil;
import priv.conceit.sc.hoxton.common.util.IoUtil;
import priv.conceit.sc.hoxton.file.handle.compress.AbsCompressHandle;
import priv.conceit.sc.hoxton.file.handle.compress.CompressHandleFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Objects;

@Component
@Slf4j
public class CompressPreviewHandle extends AbsPreviewHandle{

    @Autowired
    DefaultPreviewHandle defaultPreviewHandle;

    @Autowired
    CompressHandleFactory compressHandleFactory;

    /**
     * 根据文件实体 将其处理为对应的文件预览类型
     *
     * @param filePathDTO 文件
     * @param file 文件
     * @return FilePreviewDTO 文件预览dto
     * @author conceit
     * @date 2020/5/15 21:21
     */
    @Override
    public FilePreviewDTO preview(FilePathDTO filePathDTO, File file){
        FilePreviewDTO filePreviewDTO=new FilePreviewDTO();
        filePreviewDTO.setContentType(MediaType.APPLICATION_PDF_VALUE);
        filePreviewDTO.setBytes(IoUtil.toByteArrayUseFileChannel(file));
        return filePreviewDTO;
    }

    /**
     * 根据流对象 将其处理为对应的文件预览类型
     *
     * @param filePathDTO 文件路径信息
     * @return inputStream 文件流
     * @return FilePreviewDTO 文件预览dto
     * @author conceit
     * @date 2020/5/15 21:21
     */
    @Override
    public FilePreviewDTO preview(FilePathDTO filePathDTO, InputStream inputStream){
        File convertDir=getConvertDir();
        String convertedFileName= FileUtil.replaceFileSuffix(filePathDTO.getSavedFileName(),"pdf");
        File convertFile=new File(convertDir,convertedFileName);

        AbsCompressHandle compressHandle=compressHandleFactory.create(FileUtil.getFileSuffix(filePathDTO.getSavedFileName()));
        //没用对应的handle 调用默认的下载handle
        if(Objects.isNull(compressHandle)){
            return defaultPreviewHandle.preview(filePathDTO,inputStream);
        }

        boolean result= compressHandle.unCompress(filePathDTO,inputStream,convertFile);
        //解压缩失败 调用默认的下载handle
        if(!result){
            return defaultPreviewHandle.preview(filePathDTO,inputStream);
        }

        FilePreviewDTO filePreviewDTO=new FilePreviewDTO();
        filePreviewDTO.setContentType(MediaType.APPLICATION_PDF_VALUE);
        try {
            filePreviewDTO.setBytes(IoUtil.toByteArray(new FileInputStream(convertFile)));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return filePreviewDTO;
    }


}




